Dynamic languages have become ubiquitous in web programming. As an example, JavaScript has become the language of choice for client-side applications because of its flexibility, ease of prototyping, and portability. As web applications become more complex, computations are increasingly being delegated to the client-side to reduce network traffic and to improve user experience. JavaScript has also become common in server-side programming, game development, and the creation of desktop applications for a variety of reasons such as JavaScript programs can be easily distributed.
In JavaScript, and other dynamic languages, variable types can be changed at runtime. Thus, dynamic language compilers, or engines, typically do not generate machine code specified for a type. Instead, dynamic language compilers typically emit a generic code, or bytecode, that is adapted to run with various type combinations. In contrast, programs written in more traditional languages, such as C or C++, include type information, and compilers can provide generalized machine code for a specified type. The bytecode from dynamic language compilers is executed through interpreters, which can be significantly slower than the execution of machine code for a specified type. Performance inefficiencies of simple dynamic language scripts are relatively unnoticeable to a user. In more computational intensive applications, however, these performance inefficiencies can adversely affect user experience.
Due in part to the ubiquity of dynamic languages in web programming, dynamic compilers or engines are being developed to reduce inefficiencies associated with executing generic code through interpreters. Some optimizing engines attempt to identify sequences of type-stable bytecode and compile them into type-specific machine code. This provides for efficient execution of the bytecode sequence while conditions remain as expected. If the engine encounters an unexpected condition, a helper routine can bailout from the type-specific machine code and return to using the interpreter for the bytecode. Mechanisms currently used to determine whether a condition is expected, however, can significantly increase overhead and reduce performance efficiency.